﻿using System;
using NUnit.Framework;

namespace cshape_demo
{
    [TestFixture]
    public class VirtualMethod
    {
        /**
         * 说明:
         * 1. 从这个方法中的输出就可以看出java重的方法重载和c#中的不同之处.
         */
        [Test]
        public void TestVirtualMethod()
        {
            DrawOne drawOne = new DrawOne();
            DrawTwo drawTwo = new DrawTwo();
            
            drawOne.dram();
            drawTwo.dram();
            drawOne.draw2();
            drawTwo.draw2();
            
            ContainsVirtualMethod drawOne1 = new DrawOne();
            ContainsVirtualMethod drawTwo1 = new DrawTwo();
            
            drawOne1.dram();
            drawTwo1.dram();
            drawOne1.draw2();
            drawTwo1.draw2();
        }
    }

    public class ContainsVirtualMethod
    {
        public virtual void dram()
        {
            Console.WriteLine("绘制基础");
        }
        
        public void draw2()
        {
            Console.WriteLine("sss ContainsVirtualMethod");
        }
    }

    /**
     * 说明:
     * 1. 在java中如果子类具有一个参数列表和函数名称和父类完全一样的方法, 则子类的这个方法会覆盖父类的这个方法, 而在c#中, 虽然允许这种
     * 写法, 但是如果不讲父类的这个方法声明为虚方法的话, 就会导致在父类对象指向子类实例时调用这个重载方法时调用的总是父类的方法.
     */
    public class DrawOne : ContainsVirtualMethod
    {
        public override void dram()
        {
            Console.WriteLine("绘制了 DrawOne");
        }

        public void draw2()
        {
            Console.WriteLine("sss DrawOne");
        }
    }
    
    public class DrawTwo : ContainsVirtualMethod
    {
        public override void dram()
        {
            Console.WriteLine("绘制了 DrawTwo");
            base.dram();
        }
        
        public void draw2()
        {
            Console.WriteLine("sss DrawTwo");
        }
    }
}